package JeuDeLaVie;
import java.awt.event.*;
import javax.swing.*;

import java.awt.Color;
import java.awt.Point;
import javax.swing.BorderFactory;
import javax.swing.border.Border;

public class Controleur
{
    //Les liens vers les autres structures
    private Point positionReference;

    private Environnement lienEnv;
    private Fenetre lienFen;
    private GestionThread lienThread;
    private GestionFichier gestionFichier;
    private boolean placementMotif;
    private int motifAct;
    private boolean enPause;

    
    /* Constructeur temporaire en attendant l'officiel
     * rajouté par la même
     * Pour l'heure : fait le lien sur le modèle,
     * crée la vue et lui demande de s'afficher
     */
    public Controleur(Environnement env)
    {
	//correspondance entre le tableau de Case de l'environnement et la première CaseGrille affichee (position (0,0) au depart)
        positionReference = new Point(0,0);
        placementMotif = false;
        motifAct = 0;
        enPause = true;

        
        // lien vers le modèle
        lienEnv = env;

        //Construction de la fenêtre
        Fenetre fen = new FenetreCasesRect(env, this);

        // lien vers la fenêtre
        lienFen = fen;

	//Construction de la gestion du thread
	GestionThread thread = new GestionThread();

	//lien vers la gestion du thread
	lienThread = thread;

	//gestion des fichiers
	gestionFichier = new GestionFichier();

        //Mise à jour du listener de l'environnement
        env.setEcoutant(fen);

        // On affiche la fenêtre
        fen.affiche();

    }

    //====================
    // Fonctions activées
    //====================
    public void actionPerformedAlea()
    {
	lienEnv.grilleAleat();
    }
    
    public void actionPerformedClick(Point coord)
    {
        if (placementMotif)
	    {
		lienEnv.setMotif(motifAct, coord);
	    } else
	    {
		lienEnv.inverseEtatCase(coord);
	    }

    }
    
    public void actionPerformedInit()
    {
	lienEnv.reInitGrilleEnv();
    }
    
    public void actionPerformeFermeture()
    {
	System.exit(0);
    }
    
    public void caseSurvolee(CaseGrille caseSurv)
    {
        Border bordureNoireEpaisse = BorderFactory.createLineBorder(Color.BLACK, 2);

        if (placementMotif)
	    {
		lienFen.afficheBordsMotif(lienEnv.getMotif(motifAct), bordureNoireEpaisse, caseSurv.getCoord());
		lienFen.cacherCurseur(true);
	    } else
	    {
		caseSurv.setBorder(bordureNoireEpaisse);
		lienFen.cacherCurseur(false);
	    }


    }

    public void caseSurvoleeQuittee(CaseGrille caseSurv)
    {
        Border bordureNormale = BorderFactory.createLineBorder(Color.DARK_GRAY, 1);
        if (placementMotif)
	    {
		lienFen.afficheBordsMotif(lienEnv.getMotif(motifAct), bordureNormale, caseSurv.getCoord());
	    } else
	    {
		caseSurv.setBorder(bordureNormale);
	    }
    }

    public boolean valeurCaseDansEnvironnement(CaseGrille caseDonnee) //retourne la valeur contenue dans le tableau de Cases de l'environnement correspondant à la CaseGrille donnée
    {
	Point coordGrille = caseDonnee.getCoord();
	int x = this.positionReference.x + coordGrille.x;
	int y = this.positionReference.y + coordGrille.y;

	Case[][] tmp = this.lienEnv.getGrille();
	
	return tmp[x][y].getEtatCourant();
    }

    public void reInitGrilleEnv()
    {
	lienEnv.reInitGrilleEnv();
    }

    //initialise un nouveau tableau de taille carrée 65*65
    public void nouvelEnvironnement()
    {
	this.lienEnv = new Environnement();
    }

    //initialise un nouveau tableau de taille carrée taille*taille
    public void nouvelEnvironnement(int taille)
    {
	this.lienEnv = new Environnement(taille);
    }

    public void fermerProgramme(WindowEvent arg0)
    {
	System.exit(0);
    }
    
    public void actionPerformedMotif(int indice)
    {
        if (placementMotif)
	    {
		placementMotif = false;
		lienFen.setLabelBoutonMotif("Dessiner motif");
		lienFen.setChoixMotifActif(true);
	    } else
	    {
		placementMotif = true;
		motifAct = indice;
		lienFen.setLabelBoutonMotif("Fin dessin motif");
		lienFen.setChoixMotifActif(false);
	    }

    }
        
    public void actionPerformedAide(){
	lienFen.afficherAide();
    }
        
        
    public void actionPerformedLancer()
    {
        if (enPause)
        {
            lienFen.setLabelBoutonMenuLancer("Pause", "Mettre en pause");
            this.lienThread.lancerSimu(lienEnv);
            enPause = false;
        } else
        {
            lienFen.setLabelBoutonMenuLancer("Lancer", "Lancer la simulation");
            this.lienThread.pause(lienEnv);
            enPause = true;
        }
    }
    
    public void actionPerformedChoixRegles(int indiceRegles){
        lienFen.setLabelExplRegles(lienEnv.getRegles(indiceRegles).getExplReles());       
    }
    
    public void actionPerformedBoutonChoixRegles(int indiceRegles){
        lienEnv.setReglesAct(indiceRegles);
       String nomRegles = "Règles en cours : " + lienEnv.getRegles(indiceRegles).getNomRegles();
       lienFen.setLabelNomRegles(nomRegles);
    }

    /*===================================
     * Gestion du système de sauvegarde
     *===================================*/

    public void enregistrerSauvegarde()
    {
	gestionFichier.enregistrerFichier(lienEnv);
    }

    public void chargerSauvegarde()
    {
	lienEnv.chargerSauvegarde();

    }     
}
